如果一個類別繼承了另一個類別,那麼被繼承的那個類別就稱為「superclass」(父類別),而繼承它的類別稱為「subclass」(子類別)。
本篇要來介紹一下super
這個關鍵字的用途。
super
關鍵字主要有以下用途:
1. 取得父類別的屬性(欄位): 在子類別中,如果存在與父類別同名的欄位,可以使用 super.欄位名稱 來明確訪問父類別的欄位,以避免混淆。
2. 呼叫父類別的方法: 子類別可以使用 super.方法名稱() 來調用父類別的方法。
3. 在子類別建構式中呼叫父類別的建構式: 在子類別的建構式中,可以使用 super(參數) 來調用父類別的特定建構式
例如:
class Animal {
String color = "unknow";
void eat() {
System.out.println("eating...");
}
// 父類別建構式
Animal(String categoryName) {
System.out.println("An animal is created.");
System.out.println("It is a(n) " + categoryName);
}
}
class Dog extends Animal {
String color = "black";
void doSomething() {
System.out.println(color); // 子類別的 color 欄位
System.out.println(super.color); // 取得父類別的 color 欄位
super.eat(); // 呼叫父類別的方法
}
// 子類別建構式
Dog() {
super("dog"); // 若無寫此行,編譯器會幫自動新增super()
System.out.println("Dog is created.");
}
}
class TestSuper1 {
public static void main(String args[]) {
Dog d = new Dog();
d.doSomething();
}
}
// output: An animal is created.
// output: It is a(n) dog
// output: Dog is created.
// output: black
// output: unknow
// output: eating...
※如果父類別有「無參數建構式」,且子類別的建構式中沒有明確調用 super()
,編譯器會自動在子類別的建構式的第一行插入 super()
,隱式地調用父類別的「無參數建構式」。
※若父類別的建構式有參數,而子類別沒有明確呼叫 super 並傳遞參數,此時會發生編譯錯誤,原因在於編譯器自動插入的 super()
不會匹配到任何帶參數的父類別建構式。